package com.quyunshuo.module.home.music

import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.quyunshuo.module.home.R

// LyricAdapter.kt
/**
 * 歌词适配器，用于在RecyclerView中显示歌词
 *
 * @param lyrics 歌词行列表，包含时间戳和歌词文本
 */
class LyricAdapter(
    private val lyrics: List<LyricLine>
) : RecyclerView.Adapter<LyricAdapter.ViewHolder>() {

    /**
     * 当前播放位置（毫秒）
     * 设置时会自动刷新视图
     */
    var currentPosition: Long = 0
        set(value) {
            // 当currentPosition被设置新值时
            field = value // 更新字段值
            notifyDataSetChanged() // 通知适配器数据已改变，触发视图刷新
        }

    /**
     * ViewHolder类，用于缓存视图引用
     */
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        // 歌词文本视图
        val textView: TextView = view.findViewById(R.id.tvLyricLine)
    }

    /**
     * 创建新的ViewHolder实例
     */
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        // 从布局文件inflate视图
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_lyric, parent, false)
        return ViewHolder(view)
    }

    /**
     * 将数据绑定到ViewHolder
     */
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // 获取当前位置的歌词行
        val lyric = lyrics[position]

        // 设置歌词文本
        holder.textView.text = lyric.text

        // 判断当前行是否为正在播放的歌词行
        val isCurrent = when {
            // 如果是最后一行：当前时间 >= 该行时间
            position == lyrics.size - 1 -> currentPosition >= lyric.time
            // 其他行：当前时间 >= 该行时间 且 小于下一行时间
            else -> currentPosition >= lyric.time &&
                    currentPosition < lyrics[position + 1].time
        }

        // 根据是否为当前行设置不同样式
        holder.textView.setTextColor(
            if (isCurrent) Color.RED else Color.GRAY // 当前行红色，其他行灰色
        )
        holder.textView.textSize = if (isCurrent) 18f else 14f // 当前行字体更大
    }

    /**
     * 获取数据项总数
     */
    override fun getItemCount() = lyrics.size
}